package ejb.com.bbva.cbm.service.ejb;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import oracle.jdbc.driver.OracleTypes;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import cbm.commons.Conexion;
import ejb.cbm.admin.bean.ProcesoBean;
import ejb.cbm.commons.JdbcHelper;
import ejb.com.bbva.cbm.service.ProgramacionService;
import ejb.com.bbva.cbm.util.HiloEjecucionCargaArchivo;

@Service("programacionService")
public class ProgramacionServiceImpl implements ProgramacionService {

	private static final Logger logger = Logger.getLogger(ProgramacionServiceImpl.class);

	public void realizarCargaArchivo() throws Exception {
		Connection cnn = null;
		CallableStatement stm = null;
		ResultSet rst = null;
		List<ProcesoBean> procesos = null;
		String error = null;
		String resultado = null;
		// 1.- OBTENEMOS LOS CODIGOS
		logger.debug("CONNEG - Iniciando realizarCargaArchivo()");

		try {
			cnn = Conexion.getConnection();
			stm = cnn.prepareCall("{call CONNEG.PQ_ARCHIVO.SP_VERIFICAR_INICIO_APP(?,?)}");
			stm.registerOutParameter(1, OracleTypes.VARCHAR);
			stm.registerOutParameter(2, OracleTypes.VARCHAR);
			stm.execute();
			error = stm.getString(2);
			resultado = stm.getString(1);
			JdbcHelper.close(null, stm, null);
			if (!error.equals("SIN ERROR")) {
				throw new Exception("Se presento un error interno en el sistema");
			}
			if (resultado.equals("0")) {
				logger.debug("CONNEG - Tiene Programacion()");
				procesos = new ArrayList<ProcesoBean>();
				stm = cnn.prepareCall("{call CONNEG.PQ_ARCHIVO.SP_ARCHIVOS_CARGA(?)}");
				stm.registerOutParameter(1, OracleTypes.CURSOR);
				stm.execute();
				rst = (ResultSet) stm.getObject(1);
				ProcesoBean proceso;

				while (rst.next()) {
					proceso = new ProcesoBean();
					proceso.setCodigo(rst.getLong("ARCHIVO_ID"));
					proceso.setProcedimiento(rst.getString("PROC_LLENADO"));
					proceso.setNombreTabla(rst.getString("TABLA"));
					proceso.setNombreFuente(rst.getString("NOMBREARCHIVO"));
					proceso.setExtension(rst.getString("EXTENSION"));
					proceso.setDir(rst.getString("RUTAENTRADA"));

					procesos.add(proceso);
				}

				JdbcHelper.close(cnn, stm, rst);
				// 2.- EJECUTAMOS LAS CARGAS
				for (ProcesoBean proc : procesos) {
					Thread hilo = new Thread(new HiloEjecucionCargaArchivo(proc));
					hilo.start();
				}
			}

			logger.debug("CONNEG - Finalizando realizarCargaArchivo()");
		} catch (Exception e) {
			logger.error("CONNEG - Error en Consulta Carga:", e);
		} finally {
			JdbcHelper.close(cnn, stm, rst);
		}
	}
}
